package com.example.demo.service;

import cn.ljserver.tool.weboffice.v3.exception.FileNotExist;
import com.easy.query.api4j.client.EasyQuery;
import com.easy.query.solon.annotation.Db;
import com.example.demo.entity.File;
import org.noear.solon.annotation.Component;

import java.util.List;
import java.util.Optional;

/**
 * file
 */
@Component
public class MyFileService {

    @Db("db1")
    private EasyQuery easyQuery;

    /**
     * 通过文件id获取文件信息，获取不到，返回异常
     *
     * @param fileId 文件id
     */
    public File fetchFile(String fileId) {
        return Optional.ofNullable(fileId)
                .map(this::findByIdAndLastVersion)
                .orElseThrow(FileNotExist::new);
    }

    /**
     * 获取单个版本
     */
    public File fetchFileVersion(String fileId, int version) {
        return Optional.ofNullable(fileId)
                .map(s -> findByIdAndVersion(fileId, version))
                .orElseThrow(FileNotExist::new);
    }

    /**
     * 通过文件id获取文件信息
     *
     * @param fileId 文件id
     */
    public List<File> findById(String fileId) {
        return easyQuery.queryable(File.class)
                .where(w -> w.eq(File::getId, fileId))
                .orderByDesc(o -> o.column(File::getVersion))
                .toList();
    }

    /**
     * 通过文件id,version获取文件信息
     *
     * @param fileId  文件id
     * @param version 版本
     */
    public File findByIdAndVersion(String fileId, int version) {
        return easyQuery.queryable(File.class)
                .where(w -> w.eq(File::getId, fileId).eq(File::getVersion, version))
                .firstOrNull();
    }

    /**
     * 通过文件id获取文件最后一条信息
     *
     * @param fileId 文件id
     */
    public File findByIdAndLastVersion(String fileId) {
        return easyQuery.queryable(File.class)
                .where(w -> w.eq(File::getId, fileId))
                .orderByDesc(o -> o.column(File::getVersion))
                .firstOrNull();
    }

    public File save(File file) {
        easyQuery.insertable(file).executeRows();
        return file;
    }

    public File update(File file) {
        easyQuery.updatable(file).executeRows();
        return file;
    }
}
